﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Xml.Linq;
using Fuyao.Business.Entities.Models;

namespace Fuyao.Data.SQLServer.DAO
{
    public class DAOGuiaRemision
    {
        string strCnx = clsConexionDB.getConexionSQL();

        public string getNumeroSerie(string columnName, string columnValue)
        {
            string _serie = string.Empty;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("select Valor from Parametro where ");
                strCommand.Append(columnName).Append("= @columnName");

                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.Parameters.Add("@columnName", SqlDbType.VarChar).Value = columnValue;
                cnx.Open();
                _serie = Convert.ToString(sqlCommand.ExecuteScalar());

            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return _serie;
        }

        public int InsertarGuiaRemision(GuiaRemision oGuiaRemision)
        {
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);
            int result = 0;
            try
            {
                strCommand.Append("FYAO_InsertGuiaRemision");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.StoredProcedure;

                sqlCommand.Parameters.Add("@ClienteID", SqlDbType.Int).Value = oGuiaRemision.ClienteID;
                sqlCommand.Parameters.Add("@NroGuiaRemision", SqlDbType.Int).Value = oGuiaRemision.NroGuiaRemision;
                sqlCommand.Parameters.Add("@NroComprobante", SqlDbType.Int).Value = oGuiaRemision.NroVenta1;
                sqlCommand.Parameters.Add("@TipoComprobante", SqlDbType.VarChar).Value = oGuiaRemision.TipoComprobante;
                sqlCommand.Parameters.Add("@NroPedido", SqlDbType.Int).Value = oGuiaRemision.NroPedido;
                sqlCommand.Parameters.Add("@CreadoPor", SqlDbType.Int).Value = oGuiaRemision.CreadoPor;
                sqlCommand.Parameters.Add("@PuntoPartida", SqlDbType.VarChar, 100).Value = oGuiaRemision.PuntoPartida;
                sqlCommand.Parameters.Add("@PuntoLlegada", SqlDbType.VarChar, 100).Value = oGuiaRemision.PuntoLlegada;
                sqlCommand.Parameters.Add("@PuntoLlegadaDep", SqlDbType.VarChar, 50).Value = oGuiaRemision.PuntoLlegadaDep;
                sqlCommand.Parameters.Add("@PuntoLlegadaProv", SqlDbType.VarChar, 100).Value = oGuiaRemision.PuntoLlegadaProv;
                sqlCommand.Parameters.Add("@PuntoLlegadaDist", SqlDbType.VarChar, 50).Value = oGuiaRemision.PuntoLlegadaDist;
                sqlCommand.Parameters.Add("@ModeloAuto", SqlDbType.VarChar, 100).Value = oGuiaRemision.ModeloAuto;
                sqlCommand.Parameters.Add("@PlacaAuto", SqlDbType.VarChar, 10).Value = oGuiaRemision.PlacaAuto;
                sqlCommand.Parameters.Add("@LC", SqlDbType.VarChar, 10).Value = oGuiaRemision.Brevete;
                sqlCommand.Parameters.Add("@NombreConductor", SqlDbType.VarChar, 100).Value = oGuiaRemision.NombreConductor;
                sqlCommand.Parameters.Add("@NombreTransportista", SqlDbType.VarChar, 100).Value = oGuiaRemision.NombreTransportista;
                sqlCommand.Parameters.Add("@RucTransportista", SqlDbType.VarChar, 11).Value = oGuiaRemision.RUCTransportista;
                sqlCommand.Parameters.Add("@Serie", SqlDbType.VarChar, 3).Value = oGuiaRemision.Serie;
                sqlCommand.Parameters.Add("@FechaIniTraslado", SqlDbType.DateTime).Value = oGuiaRemision.FechaIniTraslado;               
                sqlCommand.Parameters.Add("@MotivoTraslado", SqlDbType.Int).Value = oGuiaRemision.MotivoTraslado;
                sqlCommand.Parameters.Add("@XML", SqlDbType.Xml).Value = getItemLinqXML_InsertDetalleGuiaRemision(oGuiaRemision.DetalleGuiaRemisions);
                cnx.Open();
                result = Convert.ToInt32(sqlCommand.ExecuteScalar());
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return result;
        }

        private string getItemLinqXML_InsertDetalleGuiaRemision(ICollection<DetalleGuiaRemision> listDetalleGuiaRemision)
        {
            var xEle = new XElement("ITEMS",//raiz
                            from item in listDetalleGuiaRemision
                            select new XElement("ITEM",//nodo
                                   new XAttribute("ProductoID", item.ProductoID),
                                   new XAttribute("Cantidad", item.Cantidad)
                                   )); //atributos                                  
            return xEle.ToString();
        }

        public List<GuiaRemision> getAllGuiaRemisionByFilter(GuiaRemision BE)
        {

            GuiaRemision oGuiaRemision = null;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);
            List<GuiaRemision> listGuiaRemision = new List<GuiaRemision>();

            try
            {
                strCommand.Append("FYAO_getGuiaRemisionByFiler");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.StoredProcedure;

                sqlCommand.Parameters.Add("@NroGuiaRemision", SqlDbType.Int).Value = BE.NroGuiaRemision;
                sqlCommand.Parameters.Add("@Cliente", SqlDbType.VarChar, 100).Value = BE.NombreCliente;
                sqlCommand.Parameters.Add("@DateIni", SqlDbType.DateTime).Value = BE.FechaCreacion;
                sqlCommand.Parameters.Add("@DateFin", SqlDbType.DateTime).Value = BE.FechaDesde;
                sqlCommand.Parameters.Add("@NombreConductor", SqlDbType.VarChar,50).Value = BE.NombreConductor;

                cnx.Open();
                SqlDataReader dr = sqlCommand.ExecuteReader();

                while (dr.Read())
                {
                    oGuiaRemision = new GuiaRemision();
                    if (!Convert.IsDBNull(dr["GuiaRemisionID"])) oGuiaRemision.GuiaRemisionID = Convert.ToInt32(dr["GuiaRemisionID"]);
                    if (!Convert.IsDBNull(dr["NroGuiaRemision"])) oGuiaRemision.NroGuiaRemision = Convert.ToInt32(dr["NroGuiaRemision"]);
                    if (!Convert.IsDBNull(dr["NroGuiaRemisionDesc"])) oGuiaRemision.NroGuiaRemisionDesc = Convert.ToString(dr["NroGuiaRemisionDesc"]);
                    if (!Convert.IsDBNull(dr["ClienteID"])) oGuiaRemision.ClienteID = Convert.ToInt32(dr["ClienteID"]);
                    if (!Convert.IsDBNull(dr["NombreCliente"])) oGuiaRemision.NombreCliente = Convert.ToString(dr["NombreCliente"]);
                    if (!Convert.IsDBNull(dr["Direccion"])) oGuiaRemision.DireccionCliente = Convert.ToString(dr["Direccion"]);
                    if (!Convert.IsDBNull(dr["FechaCreacion"])) oGuiaRemision.FechaCreacion = Convert.ToDateTime(dr["FechaCreacion"]);
                    if (!Convert.IsDBNull(dr["NombreConductor"])) oGuiaRemision.NombreConductor = Convert.ToString(dr["NombreConductor"]);
                    if (!Convert.IsDBNull(dr["CantidadTotal"])) oGuiaRemision.Total = Convert.ToDouble(dr["CantidadTotal"]);
                    listGuiaRemision.Add(oGuiaRemision);
                }

                dr.Close();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return listGuiaRemision;
        }

        public GuiaRemision getGuiaRemisionByGuiaRemisionID(int GuiaRemisionID)
        {

            GuiaRemision oGuiaRemision = null;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("FYAO_getGuiaRemisionByGuiaRemisionID");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.StoredProcedure;

                sqlCommand.Parameters.Add("@GuiaRemisionID", SqlDbType.Int).Value = GuiaRemisionID;

                cnx.Open();
                SqlDataReader dr = sqlCommand.ExecuteReader();

                if (dr.Read())
                {
                    oGuiaRemision = new GuiaRemision();
                    oGuiaRemision.Cliente = new Cliente();

                    if (!Convert.IsDBNull(dr["GuiaRemisionID"])) oGuiaRemision.GuiaRemisionID = Convert.ToInt32(dr["GuiaRemisionID"]);
                    if (!Convert.IsDBNull(dr["Serie"])) oGuiaRemision.Serie = Convert.ToString(dr["Serie"]);
                    if (!Convert.IsDBNull(dr["NroGuiaRemision"])) oGuiaRemision.NroGuiaRemision = Convert.ToInt32(dr["NroGuiaRemision"]);
                    if (!Convert.IsDBNull(dr["NroGuiaRemisionDesc"])) oGuiaRemision.NroGuiaRemisionDesc = Convert.ToString(dr["NroGuiaRemisionDesc"]);
                    if (!Convert.IsDBNull(dr["ClienteID"])) oGuiaRemision.ClienteID = Convert.ToInt32(dr["ClienteID"]);
                    if (!Convert.IsDBNull(dr["NombreCliente"])) oGuiaRemision.NombreCliente = Convert.ToString(dr["NombreCliente"]);
                    if (!Convert.IsDBNull(dr["DNI"])) oGuiaRemision.Cliente.DNI = Convert.ToString(dr["DNI"]);
                    if (!Convert.IsDBNull(dr["RUC"])) oGuiaRemision.Cliente.RUC = Convert.ToString(dr["RUC"]);
                    if (!Convert.IsDBNull(dr["PuntoPartida"])) oGuiaRemision.PuntoPartida = Convert.ToString(dr["PuntoPartida"]);
                    if (!Convert.IsDBNull(dr["PuntoLlegada"])) oGuiaRemision.PuntoLlegada = Convert.ToString(dr["PuntoLlegada"]);
                    if (!Convert.IsDBNull(dr["Departamento"])) oGuiaRemision.Cliente.DepartamentoDesc = Convert.ToString(dr["Departamento"]);
                    if (!Convert.IsDBNull(dr["Provincia"])) oGuiaRemision.Cliente.ProvinciaDesc = Convert.ToString(dr["Provincia"]);
                    if (!Convert.IsDBNull(dr["Distrito"])) oGuiaRemision.Cliente.DistritoDesc = Convert.ToString(dr["Distrito"]);
                    if (!Convert.IsDBNull(dr["FechaCreacion"])) oGuiaRemision.FechaCreacion = Convert.ToDateTime(dr["FechaCreacion"]);
                    if (!Convert.IsDBNull(dr["FechaIniTraslado"])) oGuiaRemision.FechaIniTraslado = Convert.ToDateTime(dr["FechaIniTraslado"]);
                    if (!Convert.IsDBNull(dr["NombreConductor"])) oGuiaRemision.NombreConductor = Convert.ToString(dr["NombreConductor"]);
                    if (!Convert.IsDBNull(dr["NombreTransportista"])) oGuiaRemision.NombreTransportista = Convert.ToString(dr["NombreTransportista"]);
                    if (!Convert.IsDBNull(dr["RUCTransportista"])) oGuiaRemision.RUCTransportista = Convert.ToString(dr["RUCTransportista"]);
                    if (!Convert.IsDBNull(dr["Brevete"])) oGuiaRemision.Brevete = Convert.ToString(dr["Brevete"]);
                    if (!Convert.IsDBNull(dr["ModeloAuto"])) oGuiaRemision.ModeloAuto = Convert.ToString(dr["ModeloAuto"]);
                    if (!Convert.IsDBNull(dr["PlacaAuto"])) oGuiaRemision.PlacaAuto = Convert.ToString(dr["PlacaAuto"]);
                    if (!Convert.IsDBNull(dr["MotivoTraslado"])) oGuiaRemision.MotivoTraslado = Convert.ToInt32(dr["MotivoTraslado"]);
                    if (!Convert.IsDBNull(dr["TipoComprobante"])) oGuiaRemision.TipoComprobante = Convert.ToString(dr["TipoComprobante"]);
                    if (!Convert.IsDBNull(dr["NroComprobanteDesc"])) oGuiaRemision.NroComprobanteDesc = Convert.ToString(dr["NroComprobanteDesc"]);
                    if (!Convert.IsDBNull(dr["NroPedidoDesc"])) oGuiaRemision.NroPedidoDesc = Convert.ToString(dr["NroPedidoDesc"]);
                }

                dr.Close();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return oGuiaRemision;
        }

        public GuiaRemision getGuiaRemisionByNroGuiaRemision(int nroGuiaRemision)
        {

            GuiaRemision oGuiaRemision = null;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("FYAO_getGuiaRemisionByNroGuiaRemision");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.StoredProcedure;

                sqlCommand.Parameters.Add("@NroGuiaRemision", SqlDbType.Int).Value = nroGuiaRemision;

                cnx.Open();
                SqlDataReader dr = sqlCommand.ExecuteReader();

                if (dr.Read())
                {
                    oGuiaRemision = new GuiaRemision();
                    oGuiaRemision.Cliente = new Cliente();

                    if (!Convert.IsDBNull(dr["GuiaRemisionID"])) oGuiaRemision.GuiaRemisionID = Convert.ToInt32(dr["GuiaRemisionID"]);
                    if (!Convert.IsDBNull(dr["Serie"])) oGuiaRemision.Serie = Convert.ToString(dr["Serie"]);
                    if (!Convert.IsDBNull(dr["NroGuiaRemision"])) oGuiaRemision.NroGuiaRemision = Convert.ToInt32(dr["NroGuiaRemision"]);
                    if (!Convert.IsDBNull(dr["NroGuiaRemisionDesc"])) oGuiaRemision.NroGuiaRemisionDesc = Convert.ToString(dr["NroGuiaRemisionDesc"]);
                    if (!Convert.IsDBNull(dr["ClienteID"])) oGuiaRemision.ClienteID = Convert.ToInt32(dr["ClienteID"]);
                    if (!Convert.IsDBNull(dr["NombreCliente"])) oGuiaRemision.NombreCliente = Convert.ToString(dr["NombreCliente"]);
                    if (!Convert.IsDBNull(dr["DNI"])) oGuiaRemision.Cliente.DNI = Convert.ToString(dr["DNI"]);
                    if (!Convert.IsDBNull(dr["RUC"])) oGuiaRemision.Cliente.RUC = Convert.ToString(dr["RUC"]);
                    if (!Convert.IsDBNull(dr["PuntoPartida"])) oGuiaRemision.PuntoPartida = Convert.ToString(dr["PuntoPartida"]);
                    if (!Convert.IsDBNull(dr["PuntoLlegada"])) oGuiaRemision.PuntoLlegada = Convert.ToString(dr["PuntoLlegada"]);
                    if (!Convert.IsDBNull(dr["Departamento"])) oGuiaRemision.Cliente.DepartamentoDesc = Convert.ToString(dr["Departamento"]);
                    if (!Convert.IsDBNull(dr["Provincia"])) oGuiaRemision.Cliente.ProvinciaDesc = Convert.ToString(dr["Provincia"]);
                    if (!Convert.IsDBNull(dr["Distrito"])) oGuiaRemision.Cliente.DistritoDesc = Convert.ToString(dr["Distrito"]);
                    if (!Convert.IsDBNull(dr["FechaCreacion"])) oGuiaRemision.FechaCreacion = Convert.ToDateTime(dr["FechaCreacion"]);
                    if (!Convert.IsDBNull(dr["FechaIniTraslado"])) oGuiaRemision.FechaIniTraslado = Convert.ToDateTime(dr["FechaIniTraslado"]);
                    if (!Convert.IsDBNull(dr["NombreConductor"])) oGuiaRemision.NombreConductor = Convert.ToString(dr["NombreConductor"]);
                    if (!Convert.IsDBNull(dr["NombreTransportista"])) oGuiaRemision.NombreTransportista = Convert.ToString(dr["NombreTransportista"]);
                    if (!Convert.IsDBNull(dr["RUCTransportista"])) oGuiaRemision.RUCTransportista = Convert.ToString(dr["RUCTransportista"]);
                    if (!Convert.IsDBNull(dr["Brevete"])) oGuiaRemision.Brevete = Convert.ToString(dr["Brevete"]);
                    if (!Convert.IsDBNull(dr["ModeloAuto"])) oGuiaRemision.ModeloAuto = Convert.ToString(dr["ModeloAuto"]);
                    if (!Convert.IsDBNull(dr["PlacaAuto"])) oGuiaRemision.PlacaAuto = Convert.ToString(dr["PlacaAuto"]);
                    if (!Convert.IsDBNull(dr["MotivoTraslado"])) oGuiaRemision.MotivoTraslado = Convert.ToInt32(dr["MotivoTraslado"]);
                    if (!Convert.IsDBNull(dr["TipoComprobante"])) oGuiaRemision.TipoComprobante = Convert.ToString(dr["TipoComprobante"]);
                    if (!Convert.IsDBNull(dr["NroComprobanteDesc"])) oGuiaRemision.NroComprobanteDesc = Convert.ToString(dr["NroComprobanteDesc"]);
                    if (!Convert.IsDBNull(dr["NroPedidoDesc"])) oGuiaRemision.NroPedidoDesc = Convert.ToString(dr["NroPedidoDesc"]);
                }

                dr.Close();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return oGuiaRemision;
        }

        public List<DetalleGuiaRemision> getAllDetalleGuiaRemisionByGuiaRemisionID(int GuiaRemisionID)
        {

            DetalleGuiaRemision oDetalleGuiaRemision = null;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);
            List<DetalleGuiaRemision> listDetalleGuiaRemision = new List<DetalleGuiaRemision>();

            try
            {
                strCommand.Append("select Dg.GuiaRemisionID,Dg.ProductoID,Prod.CodigoProducto,Prod.DescripcionProducto,isnull(Dg.Cantidad,0) Cantidad ");
                strCommand.Append("from  DetalleGuiaRemision Dg inner join Producto Prod on Dg.ProductoID=Prod.ProductoID where  Dg.GuiaRemisionID=@GuiaRemisionID ");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.Text;

                sqlCommand.Parameters.Add("@GuiaRemisionID", SqlDbType.Int).Value = GuiaRemisionID;
                cnx.Open();
                SqlDataReader dr = sqlCommand.ExecuteReader();

                while (dr.Read())
                {
                    oDetalleGuiaRemision = new DetalleGuiaRemision();
                    if (!Convert.IsDBNull(dr["GuiaRemisionID"])) oDetalleGuiaRemision.GuiaRemisionID = Convert.ToInt32(dr["GuiaRemisionID"]);
                    if (!Convert.IsDBNull(dr["ProductoID"])) oDetalleGuiaRemision.ProductoID = Convert.ToInt32(dr["ProductoID"]);
                    if (!Convert.IsDBNull(dr["CodigoProducto"])) oDetalleGuiaRemision.CodigoProducto = Convert.ToString(dr["CodigoProducto"]);
                    if (!Convert.IsDBNull(dr["DescripcionProducto"])) oDetalleGuiaRemision.DescripcionProducto = Convert.ToString(dr["DescripcionProducto"]);
                    if (!Convert.IsDBNull(dr["Cantidad"])) oDetalleGuiaRemision.Cantidad = Convert.ToInt32(dr["Cantidad"]);
                    listDetalleGuiaRemision.Add(oDetalleGuiaRemision);
                }
                dr.Close();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return listDetalleGuiaRemision;
        }

        public bool UpdateNroComprobanteforGuiaRemision(int GuiaRemisionID, int NroComporante,string TipoComprobante, int userModify)
        {
            bool _result = false;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);
        
            try
            {
                strCommand.Append("UPDATE GuiaRemision set NroVenta1=@NroVenta1,TipoComprobante=@TipoComprobante, FechaModificacion=getDate(),ModificadoPor=@ModificadoPor ");
                strCommand.Append("WHERE GuiaRemisionID = @GuiaRemisionID ");

                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.Parameters.Add("@GuiaRemisionID", SqlDbType.Int).Value = GuiaRemisionID;
                sqlCommand.Parameters.Add("@NroVenta1", SqlDbType.Int).Value = NroComporante;
                sqlCommand.Parameters.Add("@TipoComprobante", SqlDbType.Char, 1).Value = TipoComprobante;
                sqlCommand.Parameters.Add("@ModificadoPor", SqlDbType.Int).Value = userModify;
                cnx.Open();
                _result = Convert.ToBoolean(sqlCommand.ExecuteNonQuery());

            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return _result;
        }

    }
}
